package com.aug_leo.datastructure.linkedlist;

/**
 * Leetcode 很多链表题目用到的节点类
 */
public class ListNode {
    public int val;
    public ListNode next;

    public ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder(64);
        sb.append("[");
        ListNode p = this;
        while (p != null) {
            sb.append(p.val);
            if (p.next != null) {
                sb.append(",");
            }
            p = p.next;
        }
        sb.append("]");
        return sb.toString();
//        return String.valueOf(this.val);
    }

    /**
     * 根据给定的整数数组创建一个单链表。
     * 通过反向遍历元素数组来构建链表，以便第一个添加的元素成为链表的头部。
     * 这种方法避免了对中间节点的引用，简化了链表的创建过程。
     *
     * @param elements 整数数组，其元素将用于创建链表。可以是零个或多个元素。
     * @return 返回创建的单链表的头节点。如果元素数组为空，则返回null。
     */
    public static ListNode of(int... elements) {

        // 检查元素数组是否为空，如果为空，则直接返回null
        if (elements.length == 0) {
            return null;
        }
        // 初始化一个指针pointer，用于指向当前正在构建的节点。开始时为null，表示尚未创建任何节点
        ListNode pointer = null;
        // 从数组的末尾开始遍历，反向构建链表。这样做的目的是为了在添加每个元素时，不需要处理当前节点的下一个节点
        // 因为我们可以直接将新节点的下一个节点设置为当前节点p。
        for (int i = elements.length - 1; i >= 0; i--) {
            // 创建一个新的ListNode实例，并将其作为当前指针p的下一个节点。然后将pointer移动到新创建的节点
            pointer = new ListNode(elements[i], pointer);
        }
        // 遍历完成后，pointer指向链表的头节点，因此返回p
        return pointer;
    }
}